package estructurassa.controladores.ABMCentroDeTrabajo;

import estructurassa.controladores.ABMTrabajador.ModeloTablaTrabajador;
import estructurassa.controladores.Controlador;
import estructurassa.controladores.ControladorPrincipal;
import estructurassa.controladores.FabricaControladores;
import estructurassa.entidades.CentroMaquinaria;
import estructurassa.entidades.CentroTrabajo;
import estructurassa.entidades.Maquinaria;
import estructurassa.entidades.Trabajador;
import estructurassa.expertos.ExpertoABMCentroDeTrabajo;
import estructurassa.expertos.ExpertoABMMaquinaria;
import estructurassa.expertos.ExpertoABMTrabajador;
import estructurassa.expertos.FabricaExpertos;
import estructurassa.expertos.excepciones.ABMCentroDeTrabajoException;
import estructurassa.utiles.modeloTabla.ModeloTabla;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import persistencia.Conexion;
import persistencia.exceptions.ExcepcionFachada;

/**
 *
 * @author Juan
 */
public class ControladorABMCentroDeTrabajo implements Controlador {

    PantallaABMCentroDeTrabajo pantalla;
    PantallaAgregarEmpleadoAlCentro pantallaAgregarEmpleadoAlCentro = new PantallaAgregarEmpleadoAlCentro(null, false);
    PantallaAgregarMaquinaria pantallaAgregarMaquinariaAlCentro = new PantallaAgregarMaquinaria(null, false);
    ExpertoABMCentroDeTrabajo experto;
    ExpertoABMTrabajador expertoEmpleados = new ExpertoABMTrabajador();
    ExpertoABMMaquinaria expertoMaquinarias = new ExpertoABMMaquinaria();
    CentroTrabajo centroDeTrabajo;
    Trabajador trabajadorSeleccionado;
    Maquinaria maquinariaSeleccionada;
    boolean iniciado;

    public ControladorABMCentroDeTrabajo() {
        pantalla = new PantallaABMCentroDeTrabajo();
        experto = (ExpertoABMCentroDeTrabajo) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_CENTRO_DE_TRABAJO);



        pantalla.getTablaEmpleado().setModel(new ModeloTablaEmpleados());
        pantalla.getTablaEmpleado().setAutoCreateRowSorter(true);

        pantalla.getTablaCentros().setModel(new ModeloTablaCentrosDeTrabajo());
        pantalla.getTablaCentros().setAutoCreateRowSorter(true);

        pantalla.getTablaCentroMaq().setModel(new ModeloTablaCentrosMaquinaria());
        pantalla.getTablaCentroMaq().setAutoCreateRowSorter(true);

        pantalla.getTablaCentros().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarCentro();
            }
        });





        /**
         * ################################################################
         * ################################################################
         * Barra herramientas
         * ################################################################
         * ################################################################
         */
        pantalla.getBtnGuardar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    guardar();
                } catch (ABMCentroDeTrabajoException ex) {
                }
            }
        });
        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                nuevoCentro();
            }
        });
        pantalla.getBtnDarBaja().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                darBaja();
            }
        });
        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                salir();
            }
        });
        pantalla.getBotonAgregarEmp().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarPantallaAgregarEmpleado();
            }
        });
        pantalla.getBotonAgregarMaquinaria().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                iniciarPantallaMaquinaria();
            }
        });


        pantalla.getTablaCentros().addMouseListener(new MouseAdapter() {

            int filaSeleccionada = -1;

            @Override
            public void mousePressed(MouseEvent e) {

                int indiceModelo = pantalla.getTablaCentros().convertRowIndexToModel(pantalla.getTablaCentros().rowAtPoint(e.getPoint()));
                int fila = pantalla.getTablaCentros().rowAtPoint(e.getPoint());
                if (fila > -1) {
                    filaSeleccionada = fila;
                    centroDeTrabajo = (CentroTrabajo) ((((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).getListaElementos().get(fila)));

                }
            }
        });

    }

    @Override
    public JInternalFrame getPantalla() {
        return pantalla;
    }

    @Override
    public void iniciar() {
        if (!iniciado) {
            ((ControladorPrincipal) FabricaControladores.getInstance().getControlador(FabricaControladores.controladoresNombre.PRINCIPAL)).agregarPantallaInterna(pantalla);
            iniciado = true;
        } else {
            pantalla.toFront();
            limpiarCampos();
            pantalla.setVisible(true);
        }

        ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).setListaElementos(experto.buscarCentros());
    }

    public void guardar() throws ABMCentroDeTrabajoException {

        if (!"".equals(pantalla.getTextoNombre().getText())) {
            if (centroDeTrabajo == null) {
                centroDeTrabajo = new CentroTrabajo();
            }
            centroDeTrabajo.setNombre(pantalla.getTextoNombre().getText());
            centroDeTrabajo.setListadoMaquinarias(((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).getListaElementos());
            centroDeTrabajo.setListadoTrabajadores(((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).getListaElementos());
            if (pantalla.getTextoDescripcion().getText().length() > 0) {
                centroDeTrabajo.setDescripcion(pantalla.getTextoDescripcion().getText());
            }


            try {
                experto.guardar(centroDeTrabajo);
            } catch (ABMCentroDeTrabajoException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                return;
            }
            JOptionPane.showMessageDialog(pantalla, "Centro Guardado Correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            agregarCentroATabla(centroDeTrabajo);
            limpiarCampos();
        } else {
            JOptionPane.showMessageDialog(null, "Falta completar datos", "Notificación", JOptionPane.INFORMATION_MESSAGE);
        }
        centroDeTrabajo = null;
        limpiarCampos();

    }

    private void limpiarCampos() {
        centroDeTrabajo = null;
        pantalla.getTextoCodigo().setText("");
        pantalla.getTextoDescripcion().setText("");
        pantalla.getTextoNombre().setText("");
        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(null);
        ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(null);

    }

    private void seleccionarCentro() {
        int fila = pantalla.getTablaCentros().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantalla.getTablaCentros().convertRowIndexToModel(fila);
        centroDeTrabajo = (CentroTrabajo) ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).getRow(filaModelo);
        mostrarCentros(centroDeTrabajo);
    }

    private void mostrarCentros(CentroTrabajo centro) {
        pantalla.getTextoNombre().setText(centro.getNombre());
        pantalla.getTextoCodigo().setText(centro.getCodigo());
        pantalla.getTextoDescripcion().setText(centro.getDescripcion());

        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(centroDeTrabajo.getListadoTrabajadores());
        ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(centroDeTrabajo.getListadoCentroMaquinarias());


    }

    private void agregarCentroATabla(CentroTrabajo centro) {
        List centros = ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).getListaElementos();
        for (Iterator it = centros.iterator(); it.hasNext();) {
            Object centroList = it.next();
            if (centro.equals(centroList)) {
                ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).fireTableDataChanged();
                return;
            }
        }
        ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).addRow(centro);
    }

    private void quitarMaterialTabla(CentroTrabajo centro) {
        List centros = ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).getListaElementos();
        for (Iterator it = centros.iterator(); it.hasNext();) {
            Object centrolistas = it.next();
            if (centro.equals(centrolistas)) {
                ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).getListaElementos().remove(centro);
                ((ModeloTablaCentrosDeTrabajo) pantalla.getTablaCentros().getModel()).fireTableDataChanged();
                return;
            }
        }
    }

    public void iniciarPantallaAgregarEmpleado() {

        pantallaAgregarEmpleadoAlCentro.setVisible(true);
        pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().setModel(new ModeloTablaEmpleados());
//        ((ModeloTablaEmpleados) pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().getModel()).setListaElementos(expertoEmpleados.buscarTrabajador());


        ((ModeloTablaEmpleados) pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().getModel()).setListaElementosSinRepetir(expertoEmpleados.buscarTrabajador(), ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).getListaElementos());

        pantallaAgregarEmpleadoAlCentro.getBotonSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaAgregarEmpleadoAlCentro.setVisible(false);
            }
        });
        pantallaAgregarEmpleadoAlCentro.getBotonAgregarEmpleado().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarTrabajdorAAgregar();
//                agregarTrabajadorSeleccionado();
            }
        });





    }

    public void iniciarPantallaMaquinaria() {
        pantallaAgregarMaquinariaAlCentro.setVisible(true);

        pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().setModel(new ModeloTablaMaquinaria());
        ((ModeloTablaMaquinaria) pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().getModel()).setListaElementos(expertoMaquinarias.buscarMaquinarias());

        pantallaAgregarMaquinariaAlCentro.getBotonSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaAgregarMaquinariaAlCentro.setVisible(false);
            }
        });
        pantallaAgregarMaquinariaAlCentro.getBotonAgregarMaquinariaJDialog().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (pantallaAgregarMaquinariaAlCentro.getTextoCantidadMaquinaria().getText().length() != 0) {

                    seleccionarMaquinariaAAgregar();
                }

//                agregarTrabajadorSeleccionado();
            }
        });
        pantallaAgregarMaquinariaAlCentro.getBotonSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                pantallaAgregarMaquinariaAlCentro.setVisible(false);
//                agregarTrabajadorSeleccionado();
            }
        });





    }

    private void seleccionarTrabajdorAAgregar() {
        int fila = pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().getSelectedRow();
        if (fila == -1) {
            return;
        }
        int filaModelo = pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().convertRowIndexToModel(fila);


        trabajadorSeleccionado = (Trabajador) ((ModeloTablaEmpleados) pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().getModel()).getRow(filaModelo);
        List lista = ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).getListaElementos();
        lista.add(trabajadorSeleccionado);
        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(lista);

        ((ModeloTablaEmpleados) pantallaAgregarEmpleadoAlCentro.getTablaEmpleadosJDialog().getModel()).removeElement(trabajadorSeleccionado);
    }

    private void seleccionarMaquinariaAAgregar() {
        int fila = pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().getSelectedRow();
        if (fila == -1) {
            JOptionPane.showMessageDialog(null, "No se ha seleccionado maquinaria de la lista");
            return;
        }
        int filaModelo = pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().convertRowIndexToModel(fila);



        maquinariaSeleccionada = ((Maquinaria) ((ModeloTablaMaquinaria) pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().getModel()).getRow(filaModelo));

        CentroMaquinaria centroMaquinaria = new CentroMaquinaria();
        centroMaquinaria.setMaquina(maquinariaSeleccionada);


        List lista = ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).getListaElementos();

        if (pantallaAgregarMaquinariaAlCentro.getTextoCantidadMaquinaria().getText().length() != 0) {
            centroMaquinaria.setCantidad(Integer.parseInt(pantallaAgregarMaquinariaAlCentro.getTextoCantidadMaquinaria().getText()));

            lista.add(centroMaquinaria);
            ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(lista);

            ((ModeloTablaMaquinaria) pantallaAgregarMaquinariaAlCentro.getTablaMaquinariaJDialog().getModel()).removeElement(maquinariaSeleccionada);
            pantallaAgregarMaquinariaAlCentro.getTextoCantidadMaquinaria().setText("");
            maquinariaSeleccionada = null;
        } else {
            JOptionPane.showMessageDialog(null, "Ingrese cantidad");
        }
    }

    private void nuevoCentro() {
        centroDeTrabajo = null;
        limpiarCampos();

        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(null);
        ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(null);
        limpiarCampos();
    }

    private void darBaja() {
        if (centroDeTrabajo == null) {
            return;
        }
        int confirmado = JOptionPane.showConfirmDialog(
                pantalla,
                "¿Desea dar baja al centro de trabajo: " + centroDeTrabajo.getNombre() + "?");
        if (JOptionPane.OK_OPTION == confirmado) {
            try {
                Conexion.getInstancia().iniciarTX();
                experto.darDeBaja(centroDeTrabajo);
                Conexion.getInstancia().confirmarTx();

            } catch (ABMCentroDeTrabajoException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
                Conexion.getInstancia().deshacerTx();
                return;
            } catch (ExcepcionFachada ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
                return;
            }

            try {
                if (!experto.validarExistencia2(centroDeTrabajo)) {
                    quitarMaterialTabla(centroDeTrabajo);
                    limpiarCampos();
                    JOptionPane.showMessageDialog(pantalla, "El centro seleccionado fue dado de baja correctamente", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);

                }
            } catch (ABMCentroDeTrabajoException ex) {
                ex.printStackTrace();
            }


        }
    }

    private void salir() {
        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(null);
        ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(null);
        pantalla.setVisible(false);
        pantalla.toBack();
    }

    public void limpiarPantalla() {
        centroDeTrabajo = null;
        limpiarCampos();

        ((ModeloTablaEmpleados) pantalla.getTablaEmpleado().getModel()).setListaElementos(null);
        ((ModeloTablaCentrosMaquinaria) pantalla.getTablaCentroMaq().getModel()).setListaElementos(null);

    }
}
